/**
 * 颜色相关工具函数
 */

// 扩展的随机颜色池（明亮友好且分布更均匀的颜色）
const colorPool = [
  // 蓝色系
  '#3b82f6', '#60a5fa', '#2563eb', '#1d4ed8', '#3b5bdb', '#4c6ef5', '#228be6',
  // 紫色系
  '#8b5cf6', '#a78bfa', '#7c3aed', '#6d28d9', '#7950f2', '#845ef7', '#9775fa',
  // 粉色系
  '#ec4899', '#f472b6', '#db2777', '#be185d', '#e64980', '#f06595', '#f783ac',
  // 红色系
  '#ef4444', '#f87171', '#dc2626', '#b91c1c', '#fa5252', '#ff6b6b', '#ff8787',
  // 橙色系
  '#f97316', '#fb923c', '#ea580c', '#c2410c', '#fd7e14', '#ff922b', '#ffa94d',
  // 黄色系
  '#f59e0b', '#fbbf24', '#d97706', '#b45309', '#fab005', '#fcc419', '#ffd43b',
  // 绿色系
  '#10b981', '#34d399', '#059669', '#047857', '#40c057', '#51cf66', '#69db7c',
  // 青色系
  '#06b6d4', '#22d3ee', '#0891b2', '#0e7490', '#15aabf', '#0cb6e8', '#66d9e8',
  // 灰色系
  '#6b7280', '#9ca3af', '#4b5563', '#374151', '#495057', '#868e96', '#adb5bd'
]

// 颜色缓存，用于同一分类名称保持颜色一致
const colorCache = new Map()

/**
 * 获取索引对应的颜色，确保相似的分类名有不同的颜色
 * @param {string} key - 缓存键名
 * @returns {string} - 颜色值
 */
function getKeyBasedColor(key) {
  if (!key) return getRandomColor()
  
  // 使用字符串的哈希值作为索引基础
  let hash = 0
  for (let i = 0; i < key.length; i++) {
    hash = ((hash << 5) - hash) + key.charCodeAt(i)
    hash |= 0 // 转换为32位整数
  }
  
  // 确保为正数并限制在颜色池范围内
  const colorIndex = Math.abs(hash) % colorPool.length
  return colorPool[colorIndex]
}

/**
 * 根据分类名称获取颜色
 * @param {string} categoryName - 分类名称
 * @returns {string} - 十六进制颜色值
 */
export function getCategoryColor(categoryName) {
  // 如果已经为该分类缓存了颜色，返回缓存的颜色
  if (categoryName && colorCache.has(categoryName)) {
    return colorCache.get(categoryName)
  }
  
  // 生成基于分类名的颜色
  const color = categoryName ? getKeyBasedColor(categoryName) : getRandomColor()
  
  // 如果有分类名，缓存该颜色
  if (categoryName) {
    colorCache.set(categoryName, color)
  }
  
  return color
}

/**
 * 获取随机颜色
 * @returns {string} - 十六进制颜色值
 */
export function getRandomColor() {
  const index = Math.floor(Math.random() * colorPool.length)
  return colorPool[index]
}

/**
 * 获取HSL颜色，可以指定色相范围
 * @param {number} minHue - 最小色相值(0-360)
 * @param {number} maxHue - 最大色相值(0-360)
 * @param {number} saturation - 饱和度(0-100)
 * @param {number} lightness - 亮度(0-100)
 * @returns {string} - HSL颜色字符串
 */
export function getRandomHslColor(minHue = 0, maxHue = 360, saturation = 70, lightness = 65) {
  const hueRange = maxHue - minHue
  const hue = Math.floor(Math.random() * hueRange + minHue)
  return `hsl(${hue}, ${saturation}%, ${lightness}%)`
}

/**
 * 获取一组随机颜色，确保颜色之间有足够的差异
 * @param {number} count - 需要的颜色数量
 * @param {boolean} allowRepeat - 是否允许重复颜色
 * @returns {string[]} - 十六进制颜色值数组
 */
export function getRandomColors(count, allowRepeat = false) {
  if (count <= 0) return []
  
  if (allowRepeat || count > colorPool.length) {
    // 如果允许重复或请求数量超过颜色池大小
    // 生成均匀分布的HSL颜色
    const colors = []
    const step = 360 / count
    
    for (let i = 0; i < count; i++) {
      // 计算色相，加入一些随机性但保持基本分布
      const hue = (i * step + Math.random() * step * 0.5) % 360
      // 随机化饱和度和亮度，但保持在合理范围内
      const saturation = 65 + Math.random() * 20
      const lightness = 55 + Math.random() * 20
      colors.push(`hsl(${hue}, ${saturation}%, ${lightness}%)`)
    }
    
    return colors
  } else {
    // 如果不允许重复，从颜色池中随机选择不重复的颜色
    const shuffled = [...colorPool].sort(() => 0.5 - Math.random())
    return shuffled.slice(0, count)
  }
} 